use strict;
use warnings;
use CDMA;

my @users; # tablica z danymi uzytkownikow
my @ovsf; # tablica z sekwencjami ovsf
my @gold1_64; # tablica z sekwencjami golda 64-bit
my @gold2_64;
my @user1; # to co wychodzi z nadajnika uzytkownika 1
my @user2; # to co wychodzi z nadajnika uzytkownika 2

# tworzy kanal z "wyjsc anten" poszczegolnych uzytkownikow
sub create_ch(\@\@) {
	my ($a, $b) = @_;
	my $c = [];
	$c->[$_] = $a->[$_] + $b->[$_] for ( 0 .. $#$a );
	return $c;
}

#
# wczytanie danych uzytkownikow 
#
open FH, "data/data_in";
for ( 0 .. 63 ) {
	my @tmp = split(/ /, <FH>); pop @tmp;
	push @users, \@tmp;
}
close FH;
#print "\n\n\n".@users."\n\n\n@users\n";
#print "\n\n\n".@{$users[2]}."\n\n\n@{$users[2]}\n";
#print @{$users[$_]}."\n" for ( 0 .. 63 );
#
# wczytanie sekwencji OVSF
#
open FH, "data/ovsf_64";
for ( 0 .. 63 ) {
	my @tmp = split(/ /, <FH>); pop @tmp;
	push @ovsf, \@tmp;
}
close FH;
#print "\n\n\n".@ovsf."\n\n\n@ovsf\n";
#print "\n\n\n".@{$ovsf[2]}."\n\n\n@{$ovsf[2]}\n";
#print @{$ovsf[$_]}."\n" for ( 0 .. 63 );
#
# wczytanie sekwencji golda 64bit
#
open FH, "data/gold_64";
@gold1_64 = split(/ /, <FH>); pop @gold1_64;
@gold2_64 = split(/ /, <FH>); pop @gold2_64;
close FH;
#print "\n\n\n".@gold1_64."\n\n\n@gold1_64\n";
#print "\n\n\n".@gold2_64."\n\n\n@gold2_64\n";

#
# rozproszenie wszystkich danych uzytkownikow (kazdy ciag danych innym kodem ovsf)
# w @user1 znajduja sie dane pierwszego uzytkownika a w @user2 dane drugiego ( rozproszone )	
#
my @tmp;
for ( 0 .. 63 ) {
	push @tmp, CDMA::spread(@{$users[$_]}, @{$ovsf[$_]});
}                          
#print "\n\n\n".@tmp."\n\n\n@tmp\n";
#print "\n\n\n".@{$tmp[6]}."\n\n\n@{$tmp[6]}\n";
#print @{$tmp[$_]}."\n" for ( 0 .. 63 );
my @a = @{$users[0]};
my $len = 64 * ($#a + 1) - 1;
#print "$len\n";
for ( 0 .. $len ) {
	push @user1, 0;
	push @user2, 0;
}
for my $i ( 0 .. 4 ) {			# ilosc kanalow
	for ( 0 .. $len )  {
		$user1[$_] += $tmp[$i]->[$_];
		$user2[$_] += $tmp[$i + 32]->[$_];
	}
}
# skramblowanie ------------------------------------------------ bez skramblowania
my $tmp;
$tmp = CDMA::scramble(@user1, @gold1_64); my @__user1 = @user1;
$tmp = CDMA::scramble(@user2, @gold2_64); my @__user2 = @user2;
#print "\n\n\n".@user1."\n\n\n@user1\n";

for ( 0 .. $len ) {
	# utworzenie kanalu
	my $ch = create_ch(@__user1, @__user2);
	#print "\n\n\n".@$ch."\n\n\n@$ch\n";
	# deskramblowanie ------------------------------------------------ bez deskramblowania
	#@user1 = @{CDMA::scramble(@$ch, @gold1_64)};
	#@user2 = @{CDMA::scramble(@$ch, @gold2_64)};
	# desprad in pl = ?


	my $i = 3;
	my $data1 = CDMA::despread(@$ch, @{$ovsf[$i]});
	#print "\n\n\n".@{$data1}."\n\n\n@{$data1}\n";

	my $err = 0; 
	for ( 0 .. 399 ) { ++$err if ( ( $users[$i]->[$_] == 1 and $data1->[$_] < 0 ) or ( $users[$i]->[$_] == -1 and $data1->[$_] > 0 ) ); }
	print "$err ";
	unshift @__user2, pop @__user2;
}
#$c = CDMA::despread(@$c, @b);
#for ( 0 .. $#a ) { print "$c->[$_] "; }
